\documentclass{ctexart}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{arrows,snakes,backgrounds}
\usetikzlibrary{positioning, shapes.geometric}
\title{作业四: 二叉树节点的逻辑设计}
\author{冯皓\\ 数学与应用数学(强基计划)\quad3210100135}
\begin{document}
\maketitle
\section{结构关系与设计思路}
首先根据上课老师所说，我们将node作为初始类，将node的成员设置成element以及与之相关的函数，在其意义下可以派生出较多的子类，以二叉结点binarynode为例，其作为二叉树的构成单位，应当拥有一个element与两个左右指针，由二叉结点又能派生出平衡二叉结点，相比于前者其多出整形的高度变量用来随时记录结点所在的高度，从而为树的平衡提供依据。
\par 其次根据我们学习的顺序，即从二叉树到二叉搜索树再到平衡树，相邻两个之间应当是前者派生出后者的关系，在构建binarytree.h的过程中就需要考虑他们之间的共性与特性。
\par 那么我们可以从中看到像树的打印、数的清空、树中值的查找等函数不依赖于数的类型的变化由此可以写在一般的二叉树中。而对于插入，移出等操作由于其关系到树形状的变化，搜索树与普通二叉树相比多了翻转的过程，平衡树多了balance函数的调用。对于功能类似而存在细微差别的函数，需要加上virtual关键字以免错误调用。
\par 从中也可以看出，我们目前学习的数据结构之间虽然有明显的递进关系，但也并非相互包含，包括伸展树，B树等结构，在使用继承关系的时候，需要充分考虑两两之间的不同点，才能避免错误。
\section{图例参考}
由上述的分析，为了更加直观地表示数据结构之间的关系，我们通过思维导图来呈现。
\par
\par
\begin{tikzpicture}[node distance = 1.5cm][h]
\centering
\tikzstyle{startstop} = [rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black];
\tikzstyle{decision} = [diamond, draw, text width=5.5em, text badly centered, inner sep=0pt];
\tikzstyle{process} = [rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black];
\tikzstyle{arrow} = [thick,->,>=stealth];
\node (start)[startstop]{Node};
\node (decP) [startstop, below of = start,yshift=0cm]{BinaryNode};

\node (dec2) [startstop,below of=decP, yshift=0cm]{BinaryTree};
\node (result1)[startstop,left of=decP, xshift=-3cm, yshift=-4.5cm]{AvlNode};

\node (result2) [startstop,below of=dec2,yshift=-0cm]{BinarySearchTree};
\node (result3) [startstop,below of=result2,yshift=-0cm]
{AvlTree};
\draw [arrow] (start) -- (decP);
\draw [arrow] (decP) -| node[near start, above] {}(result1);
\draw [arrow] (decP) --(dec2);
\draw [arrow] (dec2) --(result2);
\draw [arrow] (result2) --(result3);
\draw [arrow] (result1) --(result3);
\end{tikzpicture}
\end{document}